class Observer{
    constructor(data){
        this.observer(data)
    }
    observer(data){
        if(!data || typeof data !== 'object'){
            return
        }
        Object.keys(data).some(key=>{
            // 定义响应式，对数据进行劫持需要 data本身，所有的key和每个key对应的value
            this.defineReactive(data,key,data[key])
            this.observer(data[key]) // 递归深度劫持
        })
    }
    defineReactive(obj,key,value){
        let that=this
        let dep = new Dep()
        Object.defineProperty(obj,key,{ //给对象的某个key做劫持，第三个参数是一个描述对象
            enumerable:true, // 可枚举的
            configurable:true, // 可删除的
            get(){
                Dep.target && dep.addSubs(Dep.target)
                return value // 对象中的属性被获取的时候会调用这个方法把值返给，如vm.message去获取值的时候就会调用这个方法
            },
            set(newValue){ // 当vm.message={a:1}属性被设置的时候会把设置结果当作参数newValue传到set函数中把新值老值一替换就可以了
                if(newValue !== value){
                    // 这里的this指向的是调用属性的实例，比如vm点message那么this指向的是vm，a点b那么this指向的就是a
                    //that.observer(newValue) // 如果给属性设置的是一个对象那么需要重新劫持，如果是简单数据类型不需要因为这个key指向的内存地址没有被改变
                    value = newValue
                    dep.notify()
                }
            },
        })
    }
}
class Dep{
    constructor(){
        this.sub=[]
    }
    addSubs(wather){
        this.sub.push(wather)
    }
    notify(){
        this.sub.some(wather=>wather.update())
    }
}